/***************************************************************************
 *   Copyright (C) 2006 by Grzegorz Latarowski                             *
 *   g.latarowski@gmail.com                                                *
 *                                                                         *
 *   Project: AutoStop (kodowa nazwa do zmiany)                            *
 *                                                                         *
 ***************************************************************************/



/* @file Plik z deklaracja klasy UI MainWindow */



#ifndef MAINWINDOW_H
#define MAINWINDOW_H


// -----------------------------------------------------------
// includy

#include "ui_mainwindow.h"
#include <QtGui>
#include <QtCore>
#include <QtSql>
#include <QThread>

#include "sortfilterproxymodels.h"

// -----------------------------------------------------------
// definy


// -----------------------------------------------------------
// functions
void CPULoad(unsigned int seconds);
void Benchmark(QString text = QString("benchmark"), bool start = false);




// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
class MainWindow : public QMainWindow
{
Q_OBJECT;
    
public:
        /*!
        * Konstruktor.
        */
    MainWindow();  

        /*!
        * Czyści wszystkie filtry.
        */
    void clearSortFilterModels();
        /*!
        * Zwraca wskaźnik na aktualnie wyświetlany model danych.
        */
    QAbstractItemModel *model() { return ui.tableView->model(); }
        /*!
        * Ustawie nazwę pliku z bazą rekordów.
        */
    void setBaseFileName(QString &fileName) { _baseFileName = fileName; }
    
    void readBase();


    void setFilter(Filter *filter) { _filter = filter; }
    
public slots: 
        /*!
        * Wyświetla okno 'O programie'
        */
    void about();
        /*!
        * Usuwa zaznaczony wiersz.
        */
    void removeSelectedRows();
        /*!
        * Dopasowuje szerokości kolumn do zawartości. Zostawia troche
        * miejsca na wskaźnik sortowania.
        */
    void adjustColumns();
        /*!
        * Dopasowuje wysokość pierszego wiersza do zawartości. Następnie
        * ustawia wysokość pozostałych na taką samą.
        */
    void adjustRows();
        /*!
        * Otwiera okno dialogowe do pobrania od uzytkownika nazwy pliku.
        * Jeśli nazwa pliku jest poprawna to wywołuje exportBase z nagłówkiem.
        */
    void exportBaseDialog();
        /*!
        * Eksportuje aktualny widok do pliku \e fileName. Dane exportowane
        * są w formacie csv. Jeśli nagłówek to dodaje go na początku pliku.
        */
    void exportBase(QString fileName, bool header = true);
        /*!
        * Otwiera okno filtrowania danych. Ustawia filtry.
        */
    void filterWizardDialog();
        /*!
        * Chowa lub ukrywa kolumne. Którą kolumne zmienić wnosi na
        * podstawie stanu akcji z viewSetupMenu.
        */
    void hideShowColumn(bool show = false);
        /*!
        * Włącza dostępność akcji manipulowawania danymi jeśli b jest true
        */
    void setTableActionsEnabled(bool b);
        /*!
        * Wyłącza dostępność akcji manipulowawania danymi jeśli b jest true.
        * Udostępniona dla wygody.
        */
    void setTableActionsDisabled(bool b);    
        /*!
        * Czyści pole edycji szybkiego filtra i kasuje filtr
        * w globalSortFilterModel.
        */
    void clearFastFilterLineEdit();
        /*!
        * Czyści filtr. Usuwa go a potem tworzy czysty.
        */
    void clearFilter();
        /*!
        * Gdy tekst w polu edycji szybkiego filtra zostanie zmieniony
        * zostanie wprowadzone nowe wyrażenie regularne do globalSortFilterModel.
        */
    void fastFilterChanged();
        /*!
        * Czyści wszystkie listy, tabele, modele, usuwa wszystkie filtry.
        * Usuwanie filtrów jest po to aby przyśpieszyć ładowanie bazy.
        */
    void clear();
        /*!
        * Tworzy akcje ustawiania widoku.
        */
    void createSetupViewActionsList();
        /*!
        * Kasuje akcje ustawiania widoku.
        */
    void clearSetupViewActionsList();
        /*!
        * Odpowiednio ustawia modele źródłowe dla wszyskich istniejących
        * modeli. Model dla tabeli jest ustawiany w kolejności:
        * model,
        * - globalSortFilterModel,
        * - dateSortFilterModel,
        * - sortFilterModelsList,
        * = tabela
        */
    void manageModels();
        /*!
        * Z nagłówka tabeli, czyli ui.tableView->horizontalheader() pobiera
        * szerokość każdej kolumny i zapisuje ją w liście _columnsWidthList.
        * UWAGA: ta procedura powinna być uruchomiona zaraz po wczytaniu modelu.
         */
    void saveColumnsWidth();
        /*!
        * Zapisuje nową szerokość kolumny \e ligicalIndex
        * w liście _columnsWidthList.
         */
    void saveColumnWidth(int logicalIndex, int oldSize, int newSize);
        /*!
        * Nagłówek tabeli potrafi automatycznie zmienić szerokość kolumn.
        * Ta metoda ustawia szerokość każdej kolumny na odczytaną z listy
        * _columnsWidthList.
         */
    void restoreColumnsWidth();
        /*!
        * Otwiera okno dialogowe do pobrania pliku z bazą.
        */
    void openBaseDialog();
        /*!
        * Otwiera plik z bazą.
        */
    void openBase(QString fileName);
        /*!
        * Otwiera okno dialogowe do pobrania nazwy pliku nowej bazy.
        */
    void newBaseDialog();
        /*!
        * Tworzy w pliku \e fileName nową bazę danych o tabelach
        * zdefiniowanych w \e baseheader.h
        */
    void newBase(QString fileName);
    
        /*!
        * Przeszukuje folder zaczytany z baza.ini po nowe badania.
        */
    void updateBase();
        /*!
        * Zaczytuje z pliku fileName rekord i dodaje go do bazy.
        */
    void insertRecord(QString fileName);
    void startPlayback(const QModelIndex & index);
    
    void tmpSlot();
    void tmpSlot2();
    
signals:
        /*!
        * Gdy jest więcej filtrów niż sortujący to true, inaczej false.
        * Służy włączeniu/wyłączeniu akcji czyszczenia filtrów.
        */
    void filtersEnabled(bool b);
    
protected:
    void contextMenuEvent(QContextMenuEvent *event);
    void closeEvent(QCloseEvent *event);
    
private:
    
    Ui::MainWindow ui;
        
        /// Model danych przechowywanych w rekordach.
    QSqlTableModel *_model;
        /// Pośrednik szybkiego filtra. Filtruje wszystkie kolumny.
    GlobalSortFilterProxyModel *_fastFilterModel;
        /// Pośrednik sortujący tabelę.
    QSortFilterProxyModel *_globalSortModel;
        /// Złożony filtr 
    Filter *_filter;
        /// Akcje konfigurowania widoku (ukrywania kolumn).
    QList<QAction *> _setupViewActionsList;
        /// Plik z rekordamy bazy
    QString _baseFileName;
        /// Lista szerokości kolumn
    QList<int> _columnsWidthList;
        /// Lista plików ze spoinami utworzonych dla programu sonogram.
        /// Przy wyjściu z programu wszystkie pliki z tej liście są usuwane.
    QStringList _weldsFileList;
            
    
        // fast filter widget
    QToolBar *fastFilterToolBar;
    QAction *clearFastFilterAction;
    QLineEdit *fastFilterLineEdit;
    
    
}; // class MainWindow
// ---------------------------------------------------------------------------


#endif









